package com.ruoyi.common.xss;

import com.ruoyi.common.utils.StringUtils;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 自定义xss校验注解实现
 *
 * @author ruoyi
 */
public class XssValidator implements ConstraintValidator<Xss, String> {
    private static final String HTML_PATTERN = "<(\\S*?)[^>]*>.*?|<.*? />";

    /**
     * 验证指定的值是否符合XSS校验规则
     *
     * @param value 待校验的字符串值
     * @param constraintValidatorContext 约束校验器上下文
     * @return 如果值符合校验规则返回true，否则返回false
     */
    @Override
    public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) {
        if (StringUtils.isBlank(value)) {
            return true;
        }
        return !containsHtml(value);
    }

    /**
     * 检查字符串中是否包含HTML标签
     *
     * @param value 待检查的字符串
     * @return 如果包含HTML标签返回true，否则返回false
     */
    public static boolean containsHtml(String value) {
        // 使用StringBuilder收集匹配到的HTML标签
        StringBuilder sHtml = new StringBuilder();
        Pattern pattern = Pattern.compile(HTML_PATTERN);
        Matcher matcher = pattern.matcher(value);
        while (matcher.find()) {
            sHtml.append(matcher.group());
        }
        // 检查收集到的内容是否匹配HTML模式
        return pattern.matcher(sHtml).matches();
    }
}
